مشخصات مقاله
-
1828
-
0.0
-
7563
-
0
-
0
آموزش Java – Access modifier ها یا تنظیم کنندگان سطح دسترسی در Java
آموزش Java – Access modifier ها یا تنظیم کنندگان سطح دسترسی در جاوا
در جاوا دو نوع modifier یا تعریف کننده وجود دارد: access modifier ها که تنظیم کنندگان سطح دسترسی هستند و non-access modifier.
access modifier ها یا تنظیم کنندگان سطح دسترسی در جاوا سطح و میزان دسترسی (حوزه ی دسترسی) به یک متغیر، متد، تابع سازنده (constructor) یا کلاس را تعیین می کنند.
4 تنظیم کننده ی سطح دسترسی در جاوا به شرح زیر می باشند:
- private
- default
- protected
- public
تعداد زیادی non-access modifier مانند static، abstract، synchronized، native، volatile، transient و غیره ... در جاوا وجود دارد . در مبحث حاضر به شرح access modifier خواهیم پرداخت.
1) تنظیم کننده ی سطح دسترسی private
فیلد یا متدی که با سطح دسترسی private تعریف شده باشد، تنها داخل کلاس میزبان قابل دسترسی می باشد.
مثال کابردی ساده از private access modifier
در این مثال، دو کلاس به نام های A و simple داریم. کلاس A یک متد و متغیر private دارد. در نمونه ی حاضر سعی داریم از بیرون به اعضای کلاس که با سطح دسترسی private تعریف شده است، دسترسی پیدا کنیم.
همان طور که انتظار می رود، خطای زمان کامپایل رخ می دهد:
class A{
private int data=40;
private void msg(){System.out.println("Hello java");}
}
public class Simple{
public static void main(String args[]){
A obj=new A();
System.out.println(obj.data);//Compile Time Error
obj.msg();//Compile Time Error
}
}
نقش تابع سازنده ی private (Private Constructor)
اگر تابع سازنده ی یک کلاس را private تعریف کنید، در آن صورت دیگر نمی توانید نمونه ای از آن کلاس خارج از خود کلاس ایجاد کنید. مثال:
class A{
private A(){}//private constructor
void msg(){System.out.println("Hello java");}
}
public class Simple{
public static void main(String args[]){
A obj=new A();//Compile Time Error
}
}
در جاوا تنها کلاس های تعریف شده داخل کلاس دیگر (nested) می توانند با سطح دسترسی private یا protected تعریف شوند.
تنظیم کننده ی سطح دسترسی default
اگر برای یک عضو از کلاس از modifier خاصی استفاده نکنید، به صورت پیش فرض با کلیدواژه ی default علامت گذاری می شود. عضوی که با این کلیدواژه علامت گذاری می شود، تنها از داخل package میزبان قابل دسترسی می باشد.
مثال کاربردی از کلیدواژه ی default
در مثال کاربردی حاضر، دو پکیج به نام های pack و mypack ایجاد کرده ایم. در این مثال، سعی داریم به کلاس A از بیرون package میزبان آن، دسترسی داشته باشیم. از آنجایی که کلاس A با سطح دسترسی public تعریف نشده است، تنها داخل package میزبان خود قابل دسترسی می باشد.
//save by A.java
package pack;
class A{
void msg(){System.out.println("Hello");}
}
//save by B.java
package mypack;
import pack.*;
class B{
public static void main(String args[]){
A obj = new A();//Compile Time Error
obj.msg();//Compile Time Error
}
}
در مثال بالا، حوزه ی دسترسی کلاس A و متد موجود در آن msg()، با کلیدواژه ی default نشانه گذاری می شوند، به همین دلیل از بیرون package میزبان خود قابل دسترسی نیستند.
تنظیم کننده ی سطح دسترسی protected
protected یک تنظیم کننده ی سطح دسترسی است که تنها دسترسی به اعضای کلاس را از طریق وراثت امکان پذیر می داند. به عبارت دیگر اعضایی از کلاس که با protected علامت گذاری شده باشند، هم داخل package و هم خارج از آن تنها از طریق ارث بری دسترس پذیر هستند.
تنظیم کننده ی سطح دسترسی protected می تواند به متد، متغیر و تابع سازنده (constructor) اعمال شود. نمی توان این کلیدواژه را بر روی کل کلاس اعمال کرد.
مثال کاربردی از protected
در مثال پیشرو، دو package به نام های pack و mypack ایجاد می کنیم. کلاس A از پکیج pack با سطح دسترسی public تعریف شده و از بیرون پکیج میزبان دسترس پذیر می باشد. اما همان طور که در نمونه ی زیر مشاهده می کنید، متد msg() از کلاس نام برده با کلیدواژه ی protected نشانه گذاری شده است و به همین دلیل تنها کلاس های خارجی با ارث بری کلاس میزبان آن می توانند به متد مذکور دسترسی داشته باشند.
//save by A.java
package pack;
public class A{
protected void msg(){System.out.println("Hello");}
}
//save by B.java
package mypack;
import pack.*;
class B extends A{
public static void main(String args[]){
B obj = new B();
obj.msg();
}
}
خروجی:
Hello
تنظیم کننده ی سطح دسترسی public
کلیدواژه ی public سبب می شود کلاس یا عضو علامت گذاری شده با آن از کل برنامه قابل دسترسی باشد.
مثال کاربردی از تنظیم کننده ی سطح دسترسی public
//save by A.java
package pack;
public class A{
public void msg(){System.out.println("Hello");}
}
//save by B.java
package mypack;
import pack.*;
class B{
public static void main(String args[]){
A obj = new A();
obj.msg();
}
}
خروجی:
Hello
آشنایی با تمامی access modifier های java
در جدول زیر تمامی access modifier های جاوا به همراه سطح یا حوزه ی دسترسی هر یک به نمایش گذاشته شده است.
استفاده از access modifier همراه با بازنویسی متد در کلاس فرزند (method overriding)
اگر متدی را بازنویسی می کنید، متد بازنویسی شده (متدی که پیاده سازی آن داخل کلاس فرزند بازنویسی می شود) نباید محدودیت بیشتری داشته باشد.
class A{
protected void msg(){System.out.println("Hello java");}
}
public class Simple extends A{
void msg(){System.out.println("Hello java");}//C.T.Error
public static void main(String args[]){
Simple obj=new Simple();
obj.msg();
}
}
تنظیم کننده ی سطح دسترسی default نسبت به protected، محدودیت بیشتری اعمال می کند. به همین دلیل در زمان کامپایل برنامه، خطا رخ می دهد.